package cn.kgc.spring.dao.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author: mosin
 * @version: v1.0  2022/4/25
 * 基于JDK的动态代理  基于接口和实现类的代理
 *      Proxy
 *     static   Object 	newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
 *       返回指定接口的代理类的实例，该接口将方法调用分派给指定的调用处理程序。
 *     参数1：  类加载器   被代理对象的类加载器
 *     参数2：  被代理对象实现的所有接口
 *     参数3：  增强业务
 */
public class JDKProxy {

    //注入被代理的对象
    private  Object object;

    public JDKProxy(Object object){
        this.object = object;
    }

    //获取代理对象的方法
    public Object getProxy(){
        //代理对象
        Object o = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {

            //增强的业务逻辑
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("方法执行之前添加日志成功jdk....");

                Object invoke = method.invoke(object, args); // 被代理对象的方法

                System.out.println("方法执行之后添加日志成功jdk....");

                return invoke;
            }
        });
        return  o;
    }

}
